Дерево поиска
A. Простое двоичное дерево поиска
Ограничение по времени на тест: 2 секунды
Ограничение по памяти на тест: 512 мегабайт
Реализуйте просто двоичное дерево поиска.
Входные данные
Входной файл содержит описание операций с деревом, их количество не превышает 100. В каждой строке находится одна из следующих операций:
insert
— добавить в дерево ключ . Если ключ есть в дереве, то ничего делать не надо;delete
— удалить из дерева ключ . Если ключа в дереве нет, то ничего делать не надо;exists
— если ключ есть в дереве выведите «true
», если нет «false
»;next
— выведите минимальный элемент в дереве, строго больший , или «none
» если такого нет;prev
— выведите максимальный элемент в дереве, строго меньший , или «none
» если такого нет.
В дерево помещаются и извлекаются только целые числа, не превышающие по модулю .
Выходные данные
Выведите последовательно результат выполнения всех операций exists
, next
, prev
. Следуйте формату выходного файла из примера.
Пример
Входные данные
insert 2
insert 5
insert 3
exists 2
exists 4
next 4
prev 4
delete 5
next 4
prev 4
Выходные данные
true
false
5
3
none
3
Решение
B. Сбалансированное двоичное дерево поиска
Ограничение по времени на тест: 2 секунды
Ограничение по памяти на тест: 512 мегабайт
Реализуйте сбалансированное двоичное дерево поиска.
Входные данные
Входной файл содержит описание операций с деревом, их количество не превышает . В каждой строке находится одна из следующих операций:
insert
— добавить в дерево ключ . Если ключ есть в дереве, то ничего делать не надо;delete
— удалить из дерева ключ . Если ключа в дереве нет, то ничего делать не надо;exists
— если ключ есть в дереве выведите «true
», если нет «false
»;next
— выведите минимальный элемент в дереве, строго больший , или «none
» если такого нет;prev
— выведите максимальный элемент в дереве, строго меньший , или «none
» если такого нет.
В дерево помещаются и извлекаются только целые числа, не превышающие по модулю .
Выходные данные
Выведите последовательно результат выполнения всех операций exists
, next
, prev
. Следуйте формату выходного файла из примера.
Пример
Входные данные
insert 2
insert 5
insert 3
exists 2
exists 4
next 4
prev 4
delete 5
next 4
prev 4
Выходные данные
true
false
5
3
none
3
Решение
C. Добавление ключей
Ограничение по времени на тест: 2 секунды
Ограничение по памяти на тест: 256 мегабайт
Вы работаете в компании Макрохард и вас попросили реализовать структуру данных, которая будет хранить множество целых ключей.
Будем считать, что ключи хранятся в бесконечном массиве , проиндексированном с , исходно все его ячейки пусты. Структура данных должна поддерживать следующую операцию:
Insert
, где — позиция в массиве, а — некоторое положительное целое число.
Операция должна выполняться следующим образом:
- Если ячейка пуста, присвоить .
- Если непуста, выполнить
Insert
и затем присвоить .
По заданным целым числам выведите массив после выполнения последовательности операций:
Insert
Insert
Insert
Входные данные
Первая строка входного файла содержит числа — количество операций Insert
, которое следует выполнить и — максимальную позицию, которая используется в операциях Insert
.
Следующая строка содержит целых чисел , которые описывают операции Insert
, которые следует выполнить .
Выходные данные
Выведите содержимое массива после выполнения всех сделанных операций Insert
. На первой строке выведите — номер максимальной непустой ячейки в массиве. Затем выведите целых чисел — . Выводите нули для пустых ячеек.
Пример
Входные данные
5 4
3 3 4 1 3
Выходные данные
6
4 0 5 2 3 1
Решение
D. И снова сумма
Ограничение по времени на тест: 5 секунд
Ограничение по памяти на тест: 256 мегабайт
Реализуйте структуру данных, которая поддерживает множество целых чисел, с котором разрешается производить следующие операции:
- — добавить в множество число (если он там уже есть, то множество не меняется);
- — вывести сумму всех элементов из , которые удовлетворяют неравенству .
Входные данные
Исходно множество пусто. Первая строка входного файла содержит — количество операций . Следующие строк содержат операции. Каждая операция имеет вид либо «+ », либо «? ». Операция «? » задает запрос .
Если операция «+ » идет во входном файле в начале или после другой операции «+», то она задает операцию . Если же она идет после запроса «?», и результат этого запроса был , то выполняется операция .
Во всех запросах и операциях добавления параметры лежат в интервале от до .
Выходные данные
Для каждого запроса выведите одно число — ответ на запрос.
Пример
Входные данные
6
+ 1
+ 3
+ 3
? 2 4
+ 1
? 2 4
Выходные данные
3
7
Решение
-й максимум
Ограничение по времени на тест: 2 секунды
Ограничение по памяти на тест: 512 мегабайт
Напишите программу, реализующую структуру данных, позволяющую добавлять и удалять элементы, а также находить -й максимум.
Входные данные
Первая строка входного файла содержит натуральное число — количество команд . Последующие строк содержат по одной команде каждая. Команда записывается в виде двух чисел и — тип и аргумент команды соответственно (). Поддерживаемые команды:
- 1: Добавить элемент с ключом .
- 0: Найти и вывести -й максимум.
- -1: Удалить элемент с ключом .
Гарантируется, что в процессе работы в структуре не требуется хранить элементы с равными ключами или удалять несуществующие элементы. Также гарантируется, что при запросе -го максимума, он существует.
Выходные данные
Для каждой команды нулевого типа в выходной файл должна быть выведена строка, содержащая единственное число — -й максимум.
Пример
Входные данные
11
1 5
1 3
1 7
0 1
0 2
0 3
-1 5
1 10
0 1
0 2
0 3
Выходные данные
7
5
3
10
7
3
Решение
F. Неявный ключ
Ограничение по времени на тест: 2 секунды
Ограничение по памяти на тест: 256 мегабайт
Научитесь быстро делать две операции с массивом:
add i x
— добавить после -го элементаdel i
— удалить -й элемент
Входные данные
На первой строке и — длина исходного массива и количество запросов. На второй строке целых чисел от до — исходный массив. Далее строк, содержащие запросы. Гарантируется, что запросы корректны: например, если просят удалить -й элемент, он точно есть.
Выходные данные
Выведите конечное состояние массива. На первой строке количество элементов, на второй строке сам массив.
Пример
Входные данные
3 4
1 2 3
del 3
add 0 9
add 3 8
del 2
Выходные данные
3
9 2 8
Решение
G. Переместить в начало
Ограничение по времени на тест: 6 секунд
Ограничение по памяти на тест: 512 мегабайт
Вам дан массив , , , и последовательность операций: переместить элементы с по в начало массива. Например, для массива 2, 3, 6, 1, 5, 4, после операции (2, 4) новый порядок будет 3, 6, 1, 2, 5, 4. А после применения операции (3, 4) порядок элементов в массиве будет 1, 2, 3, 6, 5, 4.
Выведите порядок элементов в массиве после выполнения всех операций.
Входные данные
В первой строке входного файла указаны числа и — число элементов в массиве и число операций. Следующие строк содержат операции в виде двух целых чисел: и .
Выходные данные
Выведите целых чисел — порядок элементов в массиве после применения всех операций.
Пример
Входные данные
6 3
2 4
3 5
2 2
Выходные данные
1 4 5 2 3 6
Решение
H. Развороты
Ограничение по времени на тест: 1 секунда
Ограничение по памяти на тест: 512 мегабайт
Вам дан массив , , , и последовательность операций: переставить элементы с по в обратном порядке. Например, для массива 1, 2, 3, 4, 5, после операции (2, 4) новый порядок будет 1, 4, 3, 2, 5. А после применения операции (3, 5) порядок элементов в массиве будет 1, 4, 5, 2, 3.
Выведите порядок элементов в массиве после выполнения всех операций.
Входные данные
В первой строке входного файла указаны числа и — число элементов в массиве и число операций. Следующие строк содержат операции в виде двух целых чисел: и .
Выходные данные
Выведите целых чисел — порядок элементов в массиве после применения всех операций.
Пример
Входные данные
5 3
2 4
3 5
2 2
Выходные данные
1 4 5 2 3
Решение
I. Эх, дороги
Ограничение по времени на тест: 2 секунды
Ограничение по памяти на тест: 256 мегабайт
В многострадальном Тридесятом государстве опять готовится дорожная реформа. Впрочем, надо признать, дороги в этом государстве находятся в довольно плачевном состоянии. Так что реформа не повредит. Одна проблема — дорожникам не развернуться, поскольку в стране действует жесткий закон — из каждого города должно вести не более двух дорог. Все дороги в государстве двусторонние, то есть по ним разрешено движение в обоих направлениях (разумеется, разметка отсутствует). В результате реформы некоторые дороги будут строиться, а некоторые другие закрываться на бессрочный ремонт.
Петя работает диспетчером в службе грузоперевозок на дальние расстояния. В связи с предстоящими реформами, ему необходимо оперативно определять оптимальные маршруты между городами в условиях постоянно меняющейся дорожной ситуации. В силу большого количества пробок и сотрудников дорожной полиции в городах, критерием оптимальности маршрута считается количество промежуточных городов, которые необходимо проехать.
Помогите Пете по заданной последовательности сообщений об изменении структуры дорог и запросам об оптимальном способе проезда из одного города в другой, оперативно отвечать на запросы.
Входные данные
В первой строке входного файла заданы числа — количество городов, — количество дорог в начале реформы и — количество сообщений об изменении дорожной структуры и запросов . Следующие строк содержат по два целых числа каждая — пары городов, соединенных дорогами перед реформой. Следующие строк содержат по три элемента, разделенных пробелами. «+ » означает строительство дороги от города до города , «- » означает закрытие дороги от города до города , «? » означает запрос об оптимальном пути между городами и .
Гарантируется, что в начале и после каждого изменения никакие два города не соединены более чем одной дорогой, и из каждого города выходит не более двух дорог. Никакой город не соединяется дорогой сам с собой.
Выходные данные
На каждый запрос вида «? » выведите одно число — минимальное количество промежуточных городов на маршруте из города в город . Если проехать из в невозможно, выведите -1.
Пример
Входные данные
5 4 6
1 2
2 3
1 3
4 5
? 1 2
? 1 5
- 2 3
? 2 3
+ 2 4
? 1 5
Выходные данные
0
-1
1
2